package com.sunlands.zlcx.usercenter.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * @author anjl
 * @date 1:02 PM 2019/4/15
 * description:
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity(name = "tz_user")
@DynamicUpdate
@DynamicInsert
public class UsersDO implements Serializable {

    private static final long serialVersionUID = -5967975848079627189L;

    public static final String FIELD_ID = "id";
    public static final String FIELD_ONLINE = "online";

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 姓名
     */
    private String name;

    /**
     * 用户名(登录时分为手机和微信登录。如果微信登录，没有绑定手机的情况下，没有账号还是比较麻烦的。所以设置一个默认账号)
     */
    private String username;

    /**
     * 电话
     */
    private String phone;

    /**
     * 密码
     */
    private String password;

    /**
     * 性别
     */
    private Integer sex;

    /**
     * 生日
     */
    private Date birthday;

    /**
     * 身份
     */
    private String identity;

    /**
     * unionId
     */
    private String unionId;

    /**
     * appOpenId  app获取到的openid
     */
    private String appOpenId;

    /**
     * 用户头像
     */
    private String avatarUrl;

    /**
     * 背景图
     */
    @Column(insertable = false)
    private String backgroundUrl;

    /**
     * 设备id
     */
    private String deviceId;

    /**
     * 用户当前学习目标id
     */
    private Long currentLearnTargetId;

    /**
     * 用户当前学习目标名称
     */
    private String currentLearnTargetName;

    /**
     * 用户类型（2信息未完善用户 1真实用户 -1虚拟用户）
     */
    private Integer type;

    /**
     * 开始学习时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date startLearnTime;

    /**
     * 用户状态 用户状态,1:未学习,2:学习计时中，3:连麦学习中，-2账号被禁止登陆
     */
    private Integer status;

    /**
     * 用户是否登录（0未登录，1登录）
     */
    private Integer loggedIn;

    /**
     * 消息免打扰
     */
    private Integer disturb;

    /**
     * 创建时间
     */
    @CreationTimestamp
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;

    /**
     * 修改时间
     */
    @UpdateTimestamp
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;

    /**
     * 用户等级
     * 1. 安全用户：可以免于连麦鉴黄审核、日记敏感词审核
     * 2. 待考察用户：连麦、日记全程频率鉴黄
     * 3. 风险用户：连麦、日记全程鉴黄
     */
    private Integer leave;

    /**
     * 这个字段虽然命名为lianMaiId，
     * 但是因为计时自习室中也使用到了此id
     * 故id在计时自习室学习时含义为座位id
     * 在连麦学习时含义为pulishId
     */
    private Long lianMaiId;

    /**
     * 上麦id,连麦时，该字段有值 对应上麦roomId
     */
    private Long roomId;

    /**
     * 是否vip用户，1是，0不是
     */
    private Integer vipStatus;

    /**
     * 用户是否在线
     */
    private Integer online;
    /**
     * app是否后台运行
     */
    private Integer topRun;
    /**
     * 用户socket通道id（创建时间）
     */
    private Long channelId;

    /**
     *切到后台时间--（后台运行开始时间）
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date backRunTime;

    /**
     * 个性签名
     */
    private String personalSign;

    /**
     * 所在省
     */
    private String province;

    /**
     * 所在市
     */
    private String city;

    /**
     * 学校
     */
    private String school;

    private Integer bingingPhone;

    /**
     * tongzhuo,postgraduate
     */
    private String app;

    @SuppressWarnings("all")
    public enum StatusEnums {
        NOMAL(1),
        LEARNING(2),
        LIVE_LEARNING(3),
        LEARN_TIME_ROOM_LEARNING(60),
        ;
        public final Integer code;

        StatusEnums(Integer code) {
            this.code = code;
        }
    }

    @SuppressWarnings("all")
    public enum SexEnums {
        MAN(0),
        WOMAN(1);
        public final Integer sex;

        SexEnums(Integer sex) {
            this.sex = sex;
        }
    }

    @SuppressWarnings("all")
    public enum LoggedInEnums {
        NO(0),
        YES(1);
        public final Integer code;

        LoggedInEnums(Integer code) {
            this.code = code;
        }
    }

    @SuppressWarnings("all")
    public enum TypeEnums {
        NORMAL(1),
        INCOMPLETE(2),
        FICTITIOUS(-1);
        public final Integer code;

        TypeEnums(Integer code) {
            this.code = code;
        }
    }

    @SuppressWarnings("all")
    public enum IdentityEnums {
        PRIMARY_AND_MIDDLE_SCHOOL("primary_and_middle_school", "中小学"),
        COLLEGE_STUDENT("college_student", "大学生"),
        OFFICE_WORKER("office_worker", "上班族"),
        LIBERALS("liberals", "自由派");
        public final String type;
        public final String desc;

        IdentityEnums(String type, String desc) {
            this.type = type;
            this.desc = desc;
        }

        public static boolean contain(String type) {
            for (IdentityEnums identity : values()) {
                if (identity.type.equals(type)) {
                    return true;
                }
            }
            return false;
        }

        public static String covert(String type) {
            for (IdentityEnums identity : values()) {
                if (identity.type.equals(type)) {
                    return identity.desc;
                }
            }
            return null;
        }
    }
}
